/* 
    zip 会取每个observable 相同顺位的元素并传入callback，也就是说每个observable
    的第n 个元素会一起被传入callback，这里我们同样直接用范例讲解会比较清楚
*/

const source = Rx.Observable.interval(500).take(3);
const newest = Rx.Observable.interval(300).take(6);

const example = source.zip(newest, (x, y) => x + y);

example.subscribe({
    next: (value) => { console.log(value); },
    error: (err) => { console.log('Error: ' + err); },
    complete: () => { console.log('complete'); }
});
// 0
// 2
// 4
// complete

/* 
    zip 会等到source 跟newest都送出了第一个元素，
    再传入callback，下次则等到source 跟newest都送出了第二个元素再一起传入callback，
    所以运行的步骤如下：
*/

/* 
    source : ----0----1----2|
    newest : --0--1--2--3--4--5|
    zip(newest, (x, y) => x + y)
    example: ----0----2----4|
*/

/* 
    建议大家平常没事不要乱用zip，除非真的需要。因为zip 必须cache 住还没处理的元素，
    当我们两个observable 一个很快一个很慢时，就会cache 非常多的元素，
    等待比较慢的那个observable。这很有可能造成记忆体相关的问题！
*/